#ifndef PVECT_H
#define PVECT_H

/**
Représente un point ou un vecteur en 3D
*/
class pVect
{
    public:
        float x;
        float y;
        float z;

        pVect();
        pVect(float x, float y, float z);
        pVect(const pVect& v);
        virtual ~pVect();

        // Egalité de 2 vecteurs
        bool operator==(const pVect& v) const;

        // Inégalité de 2 vecteurs
        bool operator!=(const pVect& v) const;

        // Affectation
        pVect operator=(const pVect& v);

        // Addition d'un autre vecteur
        pVect operator+(const pVect& v) const;
        void operator+=(const pVect& v);

        // Addition d'un scalaire sur toutes les composantes
        pVect operator+(const float f) const;
        void operator+=(const float f);

        // Soustraction d'un autre vecteur
        pVect operator-(const pVect& v) const;
        void operator-=(const pVect& v);

        // Soustraction d'un scalaire sur toutes les composantes
        pVect operator-(const float f) const;
        void operator-=(const float f);

        // Multiplication de toutes les composantes par un scalaire
        pVect operator*(const float f) const;
        void operator*=(const float f);

        // Division de toutes les composantes par un scalaire
        pVect operator/(const float f) const;
        void operator/=(const float f);

        // Produit vectoriel
        pVect operator^(const pVect& v) const;
        void operator^=(const pVect& v);

        // Produit scalaire
        float operator*(const pVect& v) const;

        // Norme
        float norm() const;
        float sqrNorm() const;

        // Normalise le vecteur
        void normalize();
        pVect normalizeNew() const;

        //calcul d'un repere a partir d'une normale en un point
        void repere(pVect& i, pVect& j);

    protected:
    private:
};

#endif // PVECT_H
